.text
.section .rodata
.align 8
.LC0:
        .string "x in outer block: %d at %p\n"
.LC1:
        .string "x in inner block: %d at %p\n"
.LC2:
        .string "x in while loop: %d at %p\n"

.text
.globl main
.type main, @function
main:
    pushq %rbp
    movq %rsp, %rbp

    subq $16, %rsp
    // 如何来分配局部变量呢？不同的编译器有不同的分配方式
    // 有的是代码块和while里面的x作为同一地址
    // 有的是两者用两个地址。
    // 都可以实现，此处采取前者
    // 外部的x:-4(%rbp)
    // block和while中的x:-8(%rbp)

    movl $30, -4(%rbp) /* 外部x */
    movl -4(%rbp) /* 外部x */, %esi
    leaq -4(%rbp) /* 外部x */, %rdx
    leaq .LC0(%rip), %rdi
    call printf

    // ##### 进入代码块
    movl $77, -8(%rbp) /* block和while中的x */
    movl -8(%rbp) /* block和while中的x */, %esi
    leaq -8(%rbp) /* block和while中的x */, %rdx
    leaq .LC1(%rip), %rdi
    call printf
    // ##### 退出代码块

    movl -4(%rbp) /* 外部x */, %esi
    leaq -4(%rbp) /* 外部x */, %rdx
    leaq .LC0(%rip), %rdi
    call printf

    jmp .WHILE_11_COMPARE
.WHILE_11_ENTER:
    movl $100, -8(%rbp) /* block和while中的x */
    incl -8(%rbp) /* block和while中的x */
    movl -8(%rbp) /* block和while中的x */, %esi
    leaq -8(%rbp) /* block和while中的x */, %rdx
    leaq .LC2(%rip), %rdi
    call printf
.WHILE_11_INCR:
.WHILE_11_COMPARE:
    movl -4(%rbp) /* 外部x */, %eax
    leal 1(%rax), %edx
    movl %edx, -4(%rbp) /* 外部x */
    cmpl $33, %eax
    jl .WHILE_11_ENTER
.WHILE_11_END:
    movl -4(%rbp) /* 外部x */, %esi
    leaq -4(%rbp) /* 外部x */, %rdx
    leaq .LC0(%rip), %rdi
    call printf

    movl $0, %eax
    leave
    ret